package com.app.websocket;

import java.io.IOException;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import com.google.gson.Gson;
import lombok.ToString;
import lombok.Value;
import org.springframework.stereotype.Component;

/**
 * WebSocket 实例
 */
@ServerEndpoint("/exampleWS")
@Component
public class ExampleWebSocket {
    private Session session;
    private int site;

    /**
     * 连接建立成功调用的方法
     * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        site = Integer.parseInt(session.getQueryString());

        System.out.println(" ");
        System.out.println("打开连接");
        System.out.println("site: " + session.getQueryString());
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        System.out.println("关闭连接");
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message) {
        System.out.println("message: " + message + site++);
        sendMessage(new Gson().toJson(new MsgInfo(message, site)));
    }

    /**
     * 发生错误时调用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
        error.printStackTrace();
    }

    /**
     * 发送数据到前端
     * @param message
     */
    public void sendMessage(String message){
        try {
            this.session.getBasicRemote().sendText(message);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

@Value
@ToString
class MsgInfo{
    private String msg;
    private Integer site;
}
